import { PROJECT_PREFIX } from '../constant/index'

const timeNum = PROJECT_PREFIX + 'TIME_NUM'
/**
 * 定时器指定的时间间隔，表示的是何时将定时器的代码添加到消息队列，而不是何时执行代码。所以真正何时执行代码的时间是不能保证的，取决于何时被主线程的事件循环取到，并执行
 *
 * 每个 setTimeout 产生的任务会直接 push 到任务队列中；而 setInterval 在每次把任务 push 到任务队列前，都要进行一下判断(看上次的任务是否仍在队列中，如果有则不添加，没有则添加)
 *
 * setInterval 有两个缺点：
 *    使用 setInterval 时，某些间隔会被跳过；
 *    可能多个定时器会连续执行；
 * 参考：{@link https://juejin.cn/post/6914201197620494350}
 * @param {Function} func 要执行的函数
 * @param {number | undefined} wait 延迟时间
 */
function intervalFunc(func: (...arg: any) => any, wait?: number) {
  ;(globalThis as any)[timeNum] = setTimeout(() => {
    if (!func) return
    const loop = function () {
      typeof func === 'function' && func.call(globalThis)
      ;(globalThis as any)[timeNum] = setTimeout(loop, wait)
    }
  }, wait || 0)
}
function clearIntervalFunc() {
  globalThis.clearTimeout((globalThis as any)[timeNum])
  ;(globalThis as any)[timeNum] = null
}

export { clearIntervalFunc, intervalFunc }
